package req

import (
	"errors"
	"project-info/src/lib"
	"project-info/src/service")

const PermissionContextKey = "permission"

type Permission struct {
	NeedToken bool   // 是否需要token
	Code      string // 权限code
}

func NewPermission(code string) *Permission {
	return &Permission{NeedToken: true, Code: code}
}

// PermissionHandlerConfig 配置权限
func PermissionHandlerConfig(p *Permission) lib.MiddlewareFunc {
	return func(c *lib.GinContext) error {
		c.Set(PermissionContextKey, p)
		if err := PermissionHandler(c); err != nil {
			return err
		}
		return nil
	}
}

// PermissionHandler 权限处理,供中间件调用和ws调用
func PermissionHandler(c *lib.GinContext) error {
	token := lib.JwtParse(c)
	permission, ok := c.Get(PermissionContextKey)
	if !ok {
		// 错误信息
		return errors.New("权限配置处理出错")
	}
	perm, ok := permission.(*Permission)
	if !ok {
		return errors.New("权限配置类型错误")
	}

	// 检查 user 是否有权限，permission.Code
	hasPermission, err := service.HasPermission(c, token, perm.Code)
	if err != nil {
		return err
	}
	if !hasPermission {
		return errors.New("用户无权限访问api")
	}
	return nil
}
